import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CreateProductDto } from './dto/create-product.dto';
import { UpdateProductDto } from './dto/update-product.dto';
import { Product } from './entities/product.entity';
import { PaginatedResult } from '../../common/interfaces/pagination.interface';

/**
 * 产品服务
 * 处理产品相关的业务逻辑
 */
@Injectable()
export class ProductsService {
  constructor(
    @InjectRepository(Product)
    private productsRepository: Repository<Product>,
  ) {}

  /**
   * 创建产品
   * @param createProductDto 产品创建数据
   * @returns 创建的产品
   */
  async create(createProductDto: CreateProductDto): Promise<Product> {
    const product = this.productsRepository.create(createProductDto);
    return await this.productsRepository.save(product);
  }

  /**
   * 获取所有产品
   * @param page 页码
   * @param limit 每页数量
   * @returns 分页产品列表
   */
  async findAll(page: number = 1, limit: number = 10): Promise<PaginatedResult<Product>> {
    // 确保页码和每页数量是有效值
    const validPage = page > 0 ? page : 1;
    const validLimit = limit > 0 ? limit : 10;
    
    // 计算跳过的记录数
    const skip = (validPage - 1) * validLimit;
    
    // 执行查询
    const [items, totalItems] = await this.productsRepository.findAndCount({
      skip,
      take: validLimit,
      order: { createdAt: 'DESC' }, // 默认按创建时间降序排序
    });
    
    // 计算总页数
    const totalPages = Math.ceil(totalItems / validLimit);
    
    // 返回分页结果
    return {
      items,
      meta: {
        totalItems,
        itemsPerPage: validLimit,
        currentPage: validPage,
        totalPages,
      },
    };
  }

  /**
   * 获取单个产品
   * @param id 产品ID
   * @returns 产品信息
   */
  async findOne(id: string): Promise<Product> {
    const product = await this.productsRepository.findOne({ where: { id } });
    if (!product) {
      throw new NotFoundException(`产品ID ${id} 不存在`);
    }
    return product;
  }

  /**
   * 更新产品
   * @param id 产品ID
   * @param updateProductDto 更新数据
   * @returns 更新后的产品
   */
  async update(id: string, updateProductDto: UpdateProductDto): Promise<Product> {
    const product = await this.findOne(id);
    this.productsRepository.merge(product, updateProductDto);
    return await this.productsRepository.save(product);
  }

  /**
   * 删除产品
   * @param id 产品ID
   */
  async remove(id: string): Promise<void> {
    const product = await this.findOne(id);
    await this.productsRepository.remove(product);
  }
} 